


4. Generic programming and C++ standard LIbrary

1.

迭代器 .end() 是最后一个元素的后一位


2. 迭代器不能++ 或者--,自加,自减
  --e.end() 不合法


3. e.inert() 之后,迭代器的begin(),end()的位置都发生了改变,要从新赋值


4.
标准库的string类提供了3个成员函数来从一个string得到c类型的字符数组：c_str()、data()、copy(p,n)。

        2、c_str()是Borland封装的String类中的一个函数，它返回当前字符串的首字符地址。换种说法，c_str()函数返回一个指向正规C字符串的指针常量，内容与本string串相同。这是为了与C语言兼容，在C语言中没有string类型，故必须通过string类对象的成员函数c_str()把string对象转换成C中的字符串样式。

      3、c_str()的原型是：const char*c_str() const;

      4、c_str()生成一个const char*指针，指向以空字符终止的数组。（data()与c_str()类似，但是返回的数组不以空字符终止。）

      5、注意：一定要使用strcpy()等函数来操作c_str()返回的指针。例如下面这样写就是错误的：


char* c; 
string s="1234"; 
c = s.c_str();
      上述代码中，c最后指向的内容是垃圾，因为s对象被析构，其内容被处理，同时编译器将会报错。正确代码如下：

char *cstr,*p;
string str ("Please split this phrase into tokens");
cstr = new char [str.size()+1];
strcpy (cstr, str.c_str());



5. 减少临时对象:
    使用 const &,不要值传递
    使用 ++i 
    在函数里面定义局部变量,用于返回,避免return产生临时变量

6. 尽量使用标准库里面的算法


7.  a*=b 比 a = a*b 有效率


8. 当在派生类中定义一个函数和基类里面函数同名是,如果不想隐藏掉基类里面的函数,需要使用 using declaration
                                                                        using Based::f


9. private 继承: has-a , is implemented in terms of
   public 继承, is-a


10.  使用non-public继承来代替使用基类的实例作为一个成员变量


11. 

template<typename T, typename Impl = MyList<T>>
class MySet3{
    public:
    bool Add(const T&);
    T Get(size_t index) const;
    size_t Size() const;
private:
    Impl impl_;
}



12.

常量数据区(const data):在编译的时候就已经确定,在程序的整个生命周期里面都有效

栈区(stack): 快速存储自动变量






